Bug 550939 - GtkFileChooser listbox does not refresh selection
authorKristian Rietveld <kris@gtk.org>
Sun, 20 Sep 2009 13:27:14 +0000 (15:27 +0200)
committerKristian Rietveld <kris@gtk.org>
Mon, 21 Sep 2009 18:41:35 +0000 (20:41 +0200)
Make the quartz backend support the new queued translations.  We do this
by keeping our own copy of the region that has been set to need display.
Using this region we can intersect by the given area, translate this and also
set needs display for the resulting area.

gdk/quartz/GdkQuartzView.c
gdk/quartz/gdkgeometry-quartz.c
gdk/quartz/gdkprivate-quartz.h
gdk/quartz/gdkwindow-quartz.c
gdk/quartz/gdkwindow-quartz.h

index 761b07fb304a2cf89048b2141f3ca612d38868b5..5d643eb98499987140f25c7d3b21a0e1f28067ad 100644 (file)
   if (NSEqualRects (rect, NSZeroRect))
     return;
 
+  /* Clear our own bookkeeping of regions that need display */
+  if (impl->needs_display_region)
+    {
+      gdk_region_destroy (impl->needs_display_region);
+      impl->needs_display_region = NULL;
+    }
+
   [self getRectsBeingDrawn:&drawn_rects count:&count];
 
   /* Note: arbitrary limit here to not degrade performace too much. It would
index 3e0a26f2b1710a7f135e79a9019bf93b45c90f17..06a31f10ccf658e8538af1614f8997234fc31710 100644 (file)
@@ -29,6 +29,32 @@ _gdk_quartz_window_queue_translation (GdkWindow *window,
                                       gint       dx,
                                       gint       dy)
 {
+  GdkWindowObject *private = (GdkWindowObject *)window;
+  GdkWindowImplQuartz *impl = (GdkWindowImplQuartz *)private->impl;
+
+  int i, n_rects;
+  GdkRegion *intersection;
+  GdkRectangle *rects;
+
+  /* We will intersect the known region that needs display with the given
+   * area.  This intersection will be translated by dx, dy.  For the end
+   * result, we will also set that it needs display.
+   */
+
+  if (!impl->needs_display_region)
+    return;
+
+  intersection = gdk_region_copy (impl->needs_display_region);
+  gdk_region_intersect (intersection, area);
+  gdk_region_offset (intersection, dx, dy);
+
+  gdk_region_get_rectangles (intersection, &rects, &n_rects);
+
+  for (i = 0; i < n_rects; i++)
+    _gdk_quartz_window_set_needs_display_in_rect (window, &rects[i]);
+
+  g_free (rects);
+  gdk_region_destroy (intersection);
 }
 
 gboolean
index 2152b6ea43a4ef9c68dce8e39fac946dbd71eee9..52834b36d5d7745af8e6a4fa75e59f4bbd83a9c3 100644 (file)
@@ -149,6 +149,9 @@ void       _gdk_quartz_window_did_resign_main       (GdkWindow *window);
 void       _gdk_quartz_window_debug_highlight       (GdkWindow *window,
                                                      gint       number);
 
+void       _gdk_quartz_window_set_needs_display_in_rect (GdkWindow    *window,
+                                                         GdkRectangle *rect);
+
 /* Events */
 typedef enum {
   GDK_QUARTZ_EVENT_SUBTYPE_EVENTLOOP
index a7aaf916c2e219f285c55c9402b17f0608bd1b07..bbff7fb90e0b0b31ab0ac106b6ac655eb069d205 100644 (file)
@@ -347,12 +347,30 @@ gdk_window_impl_quartz_end_paint (GdkPaintable *paintable)
     }
 }
 
+void
+_gdk_quartz_window_set_needs_display_in_rect (GdkWindow    *window,
+                                              GdkRectangle *rect)
+{
+  GdkWindowObject *private;
+  GdkWindowImplQuartz *impl;
+
+  private = GDK_WINDOW_OBJECT (window);
+  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+
+  if (!impl->needs_display_region)
+    impl->needs_display_region = gdk_region_new ();
+
+  gdk_region_union_with_rect (impl->needs_display_region, rect);
+
+  [impl->view setNeedsDisplayInRect:NSMakeRect (rect->x, rect->y,
+                                                rect->width, rect->height)];
+
+}
+
 void
 _gdk_windowing_window_process_updates_recurse (GdkWindow *window,
                                                GdkRegion *region)
 {
-  GdkWindowObject *private = (GdkWindowObject *)window;
-  GdkWindowImplQuartz *impl = (GdkWindowImplQuartz *)private->impl;
   int i, n_rects;
   GdkRectangle *rects;
 
@@ -389,10 +407,7 @@ _gdk_windowing_window_process_updates_recurse (GdkWindow *window,
   gdk_region_get_rectangles (region, &rects, &n_rects);
 
   for (i = 0; i < n_rects; i++)
-    {
-      [impl->view setNeedsDisplayInRect:NSMakeRect (rects[i].x, rects[i].y,
-                                                    rects[i].width, rects[i].height)];
-    }
+    _gdk_quartz_window_set_needs_display_in_rect (window, &rects[i]);
 
   g_free (rects);
 
@@ -1294,12 +1309,7 @@ move_resize_window_internal (GdkWindow *window,
               gdk_region_get_rectangles (expose_region, &rects, &n_rects);
 
               for (n = 0; n < n_rects; ++n)
-                {
-                  [impl->view setNeedsDisplayInRect:NSMakeRect (rects[n].x,
-                                                                rects[n].y,
-                                                                rects[n].width,
-                                                                rects[n].height)];
-                }
+                _gdk_quartz_window_set_needs_display_in_rect (window, &rects[n]);
 
               g_free (rects);
             }
index 89f2ec06bf0abf9f556995122ffc84917defda0f..8d4751234420a4619de1ae4187c6a98dcc023d69 100644 (file)
@@ -59,6 +59,8 @@ struct _GdkWindowImplQuartz
 
   /* Sorted by z-order */
   GList *sorted_children;
+
+  GdkRegion *needs_display_region;
 };
  
 struct _GdkWindowImplQuartzClass